package QueryPlan;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;

import javax.management.Query;

import MachineLearning.LinearRegression;

import com.mysql.jdbc.ResultSet;


public class QueryBuilderNewPlan extends QueryPlanBuilder{
	
	private int inicialValue;
	private int finalValue;
	private int quantum;
	private int seletividade;
	private ArrayList<String> transacoes;
	
	
	public QueryBuilderNewPlan() throws ClassNotFoundException, SQLException {
		super();
	}
	
	public int getInicialValue() {
		return inicialValue;
	}


	public int getFinalValue() {
		return finalValue;
	}

	public int getQuantum() {
		return quantum;
	}

	public ArrayList<String> getQueries() {
		return transacoes;
	}


	public int getSeletividade() {
		return seletividade;
	}

	public void setSeletividade(int seletividade) {
		this.seletividade = seletividade;
	}

	public void newPlan(ArrayList<String> transaction, int quantum) {
		this.transacoes = transaction;
		this.quantum=quantum; 
		
		//QUAIS TUPLAS AINDA FALTAM SER RETORNADAS
		ArrayList<String> arrayTrans = transacoes;
		try{
			if(!arrayTrans.isEmpty()){
				String query = arrayTrans.get(0);
				
				int i1 = query.indexOf(">");
				int i2 = query.indexOf(" and");
				
				inicialValue = Integer.parseInt(query.substring(i1+1, i2));
				System.out.println("Valor Inicial: "+inicialValue);
				
				int i3 = query.indexOf("<=");
				String pred = query.substring(i2+5,i3);
				
				String query1;
				
				if(arrayTrans.size()>1) {
					query1 = arrayTrans.get(arrayTrans.size()-1);
					i3 = query1.indexOf("<=");
					i2 = query1.indexOf(";");
					finalValue = Integer.parseInt(query1.substring(i3+2, i2));
				}
				else{
					i2 = query.indexOf(";");
					finalValue = Integer.parseInt(query.substring(i3+2, i2));
				}
				System.out.println("Valor Final: "+finalValue);
				
				query = query.substring(0, i1); //str = select..from..
			
				//construindo consultas do novo plano
				int interval;
				setSeletividade(0);
				interval=finalValue-inicialValue;
				System.out.println("Valor Interval: "+interval);
				
				//Essa e apenas uma forma de particionar a saida F_{part}
				System.out.println("Valor Quantum: "+quantum);
				
				//no novo plano, as consultas tem um intervalo igual a tpsQuantum
				transacoes = new ArrayList<String>();
				do {					
					if(interval>quantum){
						query1 = query.concat(">"+inicialValue+" and "+pred+"<="+(quantum+inicialValue)+";");
						System.out.println("Query: "+query1);
						
						result = (ResultSet) statement.executeQuery("explain "+query1);
						result.first();
						seletividade+= LinearRegression.theta0 + LinearRegression.theta1*getResult().getInt("rows"); 
						
						transacoes.add(query1);
						inicialValue += quantum; 
						interval-=quantum;
					}
					else{
						query1 = query.concat(">"+inicialValue+" and "+pred+"<="+(interval+inicialValue)+";");
						System.out.println("Query: "+query1);
						
						result = (ResultSet) statement.executeQuery("explain "+query1);
						result.first();
						seletividade+= LinearRegression.theta0 + LinearRegression.theta1*getResult().getInt("rows");
						
						interval = 0;
						transacoes.add(query1);
						break;
					}
					
				}while(interval!=0);
			
			}
		}
		catch (SQLException e) {
			e.printStackTrace();
		}
	}

}
